﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
using System.Data;
using SinacorWebTools.Entity;
using System.Threading;

namespace SinacorWebTools.ResourceAccess
{
    public class DireitoAcesso : DataAccess
    {
        public SortableList<Entity.DireitoAcesso> ListaDireitos(string pesquisa)
        {
            SortableList<Entity.DireitoAcesso> direitos = new SortableList<Entity.DireitoAcesso>();
            conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"
							  SELECT  T1.COD_DIREITO AS COD_DIREITO
                                      ,T1.DESC_DIREITO AS DESC_DIREITO
                                      ,T1.COD_TIPODIREITO AS COD_TIPODIREITO
                                      ,T1.COD_TIPO_OPRC AS COD_TIPO_OPRC 
                                      ,T2.DESC_TIPODIREITO AS DESC_TIPODIREITO
                                    FROM 
                                      TFWDIREITO T1 INNER JOIN TFWTIPODIREITO T2
                                      ON T1.COD_TIPODIREITO = T2.COD_TIPODIREITO
                                      LEFT JOIN TGSFCAO_SINACOR_MAIS T3
                                      ON T1.COD_FCAO_SINACOR_MAIS =  T3.COD_FCAO_SINACOR_MAIS";

                if (pesquisa.Length > 0)
                {
                    cmd.CommandText += " WHERE UPPER(T1.DESC_DIREITO) LIKE '%" + pesquisa.ToUpper() + "%'";
                    cmd.CommandText += " OR UPPER(T2.DESC_TIPODIREITO) LIKE '%" + pesquisa.ToUpper() + "%'";
                }

                cmd.CommandText += " ORDER BY T1.COD_DIREITO";
                conn.Open();

                List<IDataRecord> records = (from IDataRecord r in cmd.ExecuteReader()
                                             select r).ToList();

                direitos = MapDataToBusinessEntityCollection<Entity.DireitoAcesso>(records);

                cmd.Dispose();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                {
                    conn.Close();
                    conn.Dispose();
                }
            }

            return direitos;
        }

        public int SelecionaUltimoDireito()
        {
            int cod_direito = 0;
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                conn.Open();

                cmd.CommandText = @"SELECT MAX(COD_DIREITO) FROM TFWDIREITO";

                cod_direito = Convert.ToInt32(cmd.ExecuteScalar());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return cod_direito;
        }

        public int IncluiDireito(Entity.DireitoAcesso direito)
        {
            int linhasAfetadas = 0;
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();

                cmd.CommandText = @"INSERT INTO 
									TFWDIREITO (DESC_DIREITO, COD_TIPODIREITO, COD_TIPO_OPRC, TXT_HASH";

                if (direito.Funcao.CodigoFuncao > 0)
                    cmd.CommandText += ", COD_FCAO_SINACOR_MAIS)";
                else
                    cmd.CommandText += ") ";

                cmd.CommandText += @" VALUES ('" + direito.DescricaoDireito + "', "
                                + direito.CodigoTipoDireito + ", '"
                                + direito.CodigoTipoOperacao + "', '"
                                + direito.TextoHash + "'";

                if (direito.Funcao.CodigoFuncao > 0)
                    cmd.CommandText += "," + direito.Funcao.CodigoFuncao + ")";
                else
                    cmd.CommandText += ")";

                conn.Open();
                linhasAfetadas = cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }
            return linhasAfetadas;
        }


        public int AlteraDireito(Entity.DireitoAcesso direito)
        {
            int linhasAfetadas = 0;
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"
								UPDATE 
									TFWDIREITO 
								SET 
									DESC_DIREITO = '" + direito.DescricaoDireito + @"'
									,COD_TIPODIREITO = " + direito.CodigoTipoDireito + @"
                                    ,COD_TIPO_OPRC = '" + direito.CodigoTipoOperacao + @"'
                                    ,TXT_HASH = '" + direito.TextoHash + @"'
                                    ,COD_FCAO_SINACOR_MAIS = " + (direito.Funcao.CodigoFuncao.Equals(0) ? "null" : direito.Funcao.CodigoFuncao.ToString()) + @"
								WHERE 
									COD_DIREITO = " + direito.CodigoDireito;
                conn.Open();
                linhasAfetadas = cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return linhasAfetadas;
        }

        public int DeletaDireitos(List<Entity.DireitoAcesso> direitos)
        {
            int linhasAfetadas = 0;
            DbConnection conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                conn.Open();

                foreach (Entity.DireitoAcesso direito in direitos)
                {
                    cmd.CommandText = @"
								DELETE FROM 
									TFWDIREITO 
								WHERE 
									COD_DIREITO = " + direito.CodigoDireito.ToString();

                    linhasAfetadas += cmd.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return linhasAfetadas;
        }
    }
}
